package modelo;

import clases.Articulo;
import clases.Lote;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;

/**
 *
 * @author Edder
 * @version 1.0
 */
public class MdlLote implements Modelo<Lote> {

    /**
     * Inserta lote(sin ID) de un artículo
     *
     * @param objeto Lote sin id
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    @Override
    public void insert(Lote objeto, Conexion cnx) throws SQLException {
        String sql = "INSERT INTO lote(idArticulo, fechaVencimiento, lote, estado) VALUES("
                + objeto.getArticulo().getIdArticulo() + ", '"
                + objeto.getFechaVencimiento().toString() + "', '"
                + objeto.getLote() + "', '"
                + objeto.getEstado() + "');";
        cnx.ejecutar(sql);
    }

    /**
     * Devuelve el último ID insertado
     *
     * @param cnx Conexión previamente abierta
     * @return ID
     * @throws SQLException
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException {
        String sql = "SELECT MAX(idLote) FROM lote";
        ResultSet rs = cnx.consultar(sql);
        if (rs.next()) {
            return rs.getInt(1);
        }
        return -1;
    }

    /**
     * Actualiza un Lote
     * @param objeto Lote
     * @param cnx Conexión previamente abierta
     * @throws SQLException
     */
    @Override
    public void update(Lote objeto, Conexion cnx) throws SQLException {
        String sql = "UPDATE lote SET "
                + "idArticulo = " + objeto.getArticulo().getIdArticulo() + ", "
                + "fechaVencimiento = '" + objeto.getFechaVencimiento().toString() + "', "
                + "lote = '" + objeto.getLote() + "', "
                + "estado = '" + objeto.getEstado() + "' WHERE "
                + "idLote = " + objeto.getIdLote();
        cnx.ejecutar(sql);
    }

    /**
     * Devuelve lotes que coinciden con la fecha de ventimiento
     * @param query Fecha de vencimiento
     * @param cnx Conexión previamente abierta
     * @return Lista de Lotes
     * @throws SQLException
     */
    @Override
    public ArrayList<Lote> get(String query, Conexion cnx) throws SQLException {
        String sql = "SELECT * FROM lote WHERE fechaVentimiento LIKE '" + query + "';";
        ResultSet rs = cnx.consultar(sql);
        ArrayList<Lote> lotes = new ArrayList<>();
        while(rs.next()){
            lotes.add(new Lote(
                    rs.getInt("idLote"), 
                    new Articulo(){{this.setIdArticulo(rs.getInt("idArticulo"));}},
                    LocalDate.parse(rs.getString("fechaVencimiento")), 
                    rs.getString("lote"),
                    rs.getString("estado").charAt(0)));
        }
        return lotes;
    }

    /**
     * Devuelve un lote según ID
     * @param id
     * @param cnx Conexión previamente abierta
     * @return Lote
     * @throws SQLException
     */
    @Override
    public Lote get(int id, Conexion cnx) throws SQLException {
        String sql = "SELECT * FROM lote WHERE idLote = " + id;
        ResultSet rs = cnx.consultar(sql);
        if(rs.next())
            return new Lote(
                    rs.getInt("idLote"), 
                    new Articulo(){{this.setIdArticulo(rs.getInt("idArticulo"));}},
                    LocalDate.parse(rs.getString("fechaVencimiento")), 
                    rs.getString("lote"),
                    rs.getString("estado").charAt(0));
        return null;
    }

}
